# rePython - Python RPC server/client library
#
# Copyright (C) 2013 Andrew Dunai, andunai@gmail.com
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

import rsa
import util

class RSAPool:
	def __init__(self):
		(self.myPublic, self.myPrivate) = rsa.newkeys(1024)
		self.theirPublic = None
		self.active = False

	def encryptForSend(self, data):
		util.log.debug('Encrypting data, length = %d' % len(data))
		encrypted = ''
		while len(data) > 0:
			chunk = data[0:117]
			data = data[117:]
			encrypted += rsa.encrypt(chunk, self.theirPublic)
		return encrypted

	def decryptReceived(self, data):
		util.log.debug('Decrypting data, length = %d' % len(data))
		decrypted = ''
		while len(data) > 0:
			chunk = data[0:128]
			data = data[128:]
			decrypted += rsa.decrypt(chunk, self.myPrivate)
		return decrypted

	def getMyPublic(self):
		return (self.myPublic.n, self.myPublic.e) #(hex(self.myPublic.n).rstrip('L')[2:]

	def setTheirPublic(self, n, e):
		self.active = True
		self.theirPublic = rsa.PublicKey(n=n, e=e) #rsa.PublicKey(int(key, 16)
		util.log.debug('Received public key: %s' % self.theirPublic)

	def isActive(self):
		return self.active
